﻿////////////////////////////////////////////////////////////////////////////////////////
//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING THIS SOFTWARE
//
//  By downloading, copying, installing or using the software you agree to this license.
//  If you do not agree to this license, do not download, install, copy or use the software.
//
// Copyright (C) 2013, AerVision Technologies Pty Ltd, all rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
//   * Redistribution's of source code must retain the above copyright notice,
//     this list of conditions and the following disclaimer.
//
//   * Redistribution's in binary form must reproduce the above copyright notice,
//     this list of conditions and the following disclaimer in the documentation
//     and/or other materials provided with the distribution.
//
//   * The name of AerVision Technologies, may not be used to endorse or promote products
//     derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors to demonstrate 
// www.AerCloud.net Framework as a Service API (FaaS), "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the copyright holder or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
////////////////////////////////////////////////////////////////////////////////////////

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Input;
using System.Windows.Media.Imaging;
using System.Windows.Media;
using System.Windows;
using App_AerCloudDemo.Utils;
using System.Windows.Controls;
using System.Threading.Tasks;

namespace App_AerCloudDemo.GUI.Views
{
    public class ISMEntity
    {
        public string text;
        public string tags;
    }

    public class ISMEntityView : INotifyPropertyChanged
    {
        System.Windows.Threading.Dispatcher Dispatcher = null;

        public ICollection<ISMEntityView> ParentCollection { get; set; }

        public ISMEntityView(ISMEntity entity, System.Windows.Threading.Dispatcher Dispatcher)
        {
            PersonName = entity.text;
            Entity = entity;
            this.Dispatcher = Dispatcher;
        }

        public string PersonName { get; set; }

        public ISMEntity Entity;

        ICollection<ImageLoader> _Images = null;
        public ICollection<ImageLoader> Images 
        { 
            get
            {
                if (_Images == null)
                {
                    _Images = new ObservableCollection<ImageLoader>();

                    Task.Factory.StartNew(() =>
                    {
                        var list = AerCloudNet_Interface.GetImageNames(PersonName);

                        if (list != null)
                            foreach (var item in list)
                            {
                                Dispatcher.Invoke(new Action(() =>
                                {
                                    _Images.Add(new ImageLoader(PersonName, item));
                                }));
                                System.Threading.Thread.Sleep(10);
                            }
                    });
                }
                return _Images;
            }
        }

        private void NotifyPropertyChanged(/* .net 4.5 [CallerMemberName]*/ String propertyName = "")
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        
        public event PropertyChangedEventHandler PropertyChanged;
    }

    public class BrowseDatabaseView : INotifyPropertyChanged
    {
        private bool _IsLoading = true;
        public bool IsLoading
        {
            set
            {
                _IsLoading = value;
                NotifyPropertyChanged("IsLoading");
            }
            get { return _IsLoading; }
        }

        private ICollection<ISMEntityView> _AllItems = new ObservableCollection<ISMEntityView>();

        public ICollection<ISMEntityView> Items
        {
            get
            {
                return _AllItems;
            }
        }

        protected void RefreshItems()
        {
            NotifyPropertyChanged("Items");
        }

        public void RefreshView(ICollection<ISMEntity> entities, System.Windows.Threading.Dispatcher Dispatcher)
        {
            IsLoading = true;
            _AllItems.Clear();
            if (entities != null)
                foreach (ISMEntity entity in entities)
                {
                    var e = new ISMEntityView(entity, Dispatcher);
                    _AllItems.Add(e);
                }
            IsLoading = false;
        }

        private void NotifyPropertyChanged(/* .net 4.5 [CallerMemberName]*/ String propertyName = "")
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}